package br.com.ufc.contoller;

import br.com.ufc.model.TarefaTO;
import java.util.Vector;

import br.com.ufc.exception.BusinessException;
import br.com.ufc.exception.IntegrationException;
import br.com.ufc.model.Tarefa;
import br.com.ufc.model.TarefaDesenvolvimento;
import br.com.ufc.model.TarefaDesenvolvimentoAuto;

public class AgendaVector implements Agendavel {

    private Vector<Tarefa> tarefas;

    public Vector<Tarefa> getTarefas() {
        return tarefas;
    }

    public void setTarefas(Integer tamanhoArray) {
        this.tarefas = new Vector<Tarefa>(tamanhoArray);
    }

    public Tarefa consultarTarefaPorCodigo(Long codigo)
            throws IntegrationException {
        for (Tarefa t : this.tarefas) {
            if (t.getCodigo().intValue() == codigo.intValue()) {
                return t;
            }
        }
        throw new IntegrationException("Nenhuma tarefa com o c�digo " + codigo.intValue());
    }

    public Boolean cadastrarTarefa(Tarefa t) {
        this.tarefas.add(t);
        // seta o codigo da tarefa caso a implementacao da classe tarefa n�o
        // gere automaticamente
        if (!(t instanceof TarefaDesenvolvimentoAuto)) {
            t.setCodigo(new Long(this.tarefas.indexOf(t) + 1));
        }
        return true;
    }

    public Tarefa consultarTarefa(Long codigo) throws IntegrationException {
        Tarefa result = null;
        for (Tarefa t : this.tarefas) {
            if ((t != null) && (t.getCodigo().intValue() == codigo.intValue())) {
                result = t;
                break;
            }
        }

        if (result == null) {
            throw new IntegrationException("Nenhuma tarefa com o c�digo " + codigo.intValue());
        }
        return result;
    }

    public Boolean encerrarTodasTarefas() {
        for (Tarefa t : this.tarefas) {
            if (t != null) {
                t.encerrarTarefa(0D);
            }
        }
        return true;
    }

    public Boolean removerTarefa(Tarefa t) {
        if (this.tarefas.remove(t)) {
            return true;
        } else {
            return false;
        }
    }

    public Boolean iniciarTarefa(Tarefa t) {
        if (t != null) {
            t.iniciarTarefa();
            return true;
        }
        return false;
    }

    public void iniciarTarefa(Long codigo) throws IntegrationException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public Boolean encerrarTarefa(Tarefa t, Double valorCobrado) {
        if (t != null) {
            t.encerrarTarefa(valorCobrado);
            return true;
        }
        return false;
    }

    @Override
    public void incrementarImportancia(Tarefa t) {
        t.incrementarImportancia();
    }

    @Override
    public Boolean cancelarTarefa(Tarefa t) {
        return t.cancelarTarefa();
    }

    @Override
    public Boolean reiniciarTarefa(Tarefa t) throws BusinessException {
        if (t instanceof TarefaDesenvolvimento) {
            return ((TarefaDesenvolvimento) t).reinicarTarefa();
        } else {
            throw new BusinessException("N�o � poss�vel reiniciar uma tarefa do tipo GERENCIAL");
        }
    }

    public void cancelarTarefa(Long codigo) throws IntegrationException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public TarefaTO listarTarefas() {
        TarefaTO aTO = new TarefaTO();
        aTO.setListaTarefas(this.tarefas);
        return aTO;
    }

    public void encerrarTarefa(Long codigo, Double valorCobrado) throws IntegrationException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void removerTarefa(Long codigo) throws IntegrationException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void reiniciarTarefa(Long codigo) throws IntegrationException {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
